iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
0

Day 12 Kubernetes 持久戰-Rancher Longhorn 安裝基礎操作篇

本日重點與方向 (TAG): kubernetes、k8s、PV、persistent volume、PVC、persistent volume claim、Pod use PVC、Rancher、Longhorn、SC、StorageClass
今天將會介紹使用 Bare Metal 進行 Kubernetes 環境中持久化儲存的軟體功能測試,主要會是以 Rancher 開源專案 Longhorn 進行驗證,並對於昨日組建的 kubernetes 功能進行整合,如果你中途裝一裝有一些異常與失敗的話,基本上就是參考昨天的安裝筆記重建叢集,配置上基本上就是相同的, Longhorn 官方安裝基本上 yaml 下載就可以部署,之後就弄好啦,有副本需求相關的資源型態設定,他的設計的概念是基於 StorageClass 的配置,當然還有一些進階一點的去看官方網站 吧 (繼續甩鍋) ,詳細的操作還是去看看大陸那邊的吧。

本次使用設備資訊

Network Switch

  • 數量: 1
  • 型號: D-Link 1210-28 (L2 Switch)

Bare Metal

Master Node

  • 數量: 1
  • Node Name: sdn-k8s-b2-0
  • Ubuntu: 16.04 / 18.04
  • Docker Version: 19.03
  • CPU: AMD Opteron 6174 ^ 2
  • RAM: 32GB
  • Disk: 120 GB (SSD)
  • Network: 1Gbps

Worker Node

  • 數量: 3
  • Ubuntu: 16.04 / 18.04
  • Docker Version: 19.03
  • CPU: E3-1230_v3
  • RAM: 8 GB
  • Disk: 250 GB (HDD)
  • Network: 1Gbps

Longhorn on Kubernetes

環境需求

  • Ubuntu:18.04
  • Docker: v1.13+
  • Kubernetes: v1.14+

系統配置

預裝 Linux 套件指令

  • curl
  • findmnt
  • grep
  • awk
  • blkid
  • lsblk

kubernetes API-Server 開啟功能

cat /etc/kubernetes/manifests/kube-apiserver.yaml
> - --allow-privileged=true

安裝 Longhorn

安裝 Linux 硬碟相關套件

apt-get install open-iscsi
service iscsid start
service iscsid status

kubectl 安裝方法

官方部署流程

  • 部署線上的 Longhorn.yaml
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml
  • 觀看是否部署完成
kubectl get pods --namespace longhorn-system

helm 安裝方法

  • Install Helm3
snap install helm3
  • Create Namespace
kubectl create namespace longhorn-system
  • Export kube config
kubectl config view --raw > ./kubeconfig.yaml
  • Clone and Deploy Longhorn
git clone https://github.com/longhorn/longhorn
helm3 install longhorn ./longhorn/chart/ --namespace longhorn-system --kubeconfig ./kubeconfig.yaml

處理 Longhorn Web UI 登入對外 (這年頭就是 UI 漂亮才是王道)

https://www.bookstack.cn/read/longhorn-0.8.1-en/415e7720ab3e8fa6.md
https://kubernetes.github.io/ingress-nginx/deploy/

  1. 設定 Longhorn Web UI 的登入帳號密碼
USER=admin; 
PASSWORD=admin;
echo "${USER}:$(openssl passwd -stdin -apr1 <<< ${PASSWORD})" >> auth
  1. 將帳號密碼測定成 Secret 進行部署
kubectl -n longhorn-system create secret generic basic-auth --from-file=auth
  1. 設定 nginx-ingress
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.35.0/deploy/static/provider/baremetal/deploy.yaml
  1. 設定 longhorn-ingress
  • yaml
longhorn-ingress.yml
-----
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: longhorn-ingress
  namespace: longhorn-system
  annotations:
    # type of authentication
    nginx.ingress.kubernetes.io/auth-type: basic
    # name of the secret that contains the user/password definitions
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    # message to display with an appropriate context why the authentication is required
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required '
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: longhorn-frontend
          servicePort: 80
  • apply
kubectl -n longhorn-system apply -f longhorn-ingress.yml
  1. 抓取 nginx-ingress 的 nodePort
  • command
kubectl get svc -A | grep "nginx"
  • response
root@sdn-k8s-b2-1-2:~# kubectl get svc -A | grep "nginx"
ingress-nginx     ingress-nginx-controller             NodePort    10.105.219.176   <none>        80:30416/TCP,443:30412/TCP   91m
ingress-nginx     ingress-nginx-controller-admission   ClusterIP   10.98.187.185    <none>        443/TCP                      91m
  1. 登入 Longhorn Web UI

使用一下 Longhorn

驗證安裝環境

  • 確認一下你的 Longhorn 基礎的 StorageClass 狀態
kubectl get storage 

基於 StorageClass 部署 PVC 生成 PVC

  • 這邊的 StorageClass 會基於先前 Longhorn 給的那個
longhorn-pvc.yaml
-----
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-volv-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 5Gi
  • 部署 PVC 下去
kubectl apply -f longhorn-pvc.yaml
  • 驗證 PVC 透過 StorageClass 生成
kubectl get pv,pvc

綁定 PVC 到 Pod 之上

  • 這邊的 spec.volumes.persistentVolumeClaim.claimName 要對應先前部署的 PVC
pod-use-longhorn-pvc.yaml
-----
apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: volume-test
    image: ubuntu
    imagePullPolicy: IfNotPresent
    command:
    - sleep
    - "6000000"
    volumeMounts:
    - name: volv
      mountPath: "/data"
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: longhorn-volv-pvc
  • 部署 Pod 下去
kubectl apply -f pod-use-longhorn-pvc.yaml
  • 檢視一下 Pod 狀態
kubectl get pod -o wide

  • 檢視 Pod 中掛載 PVC 的位置
kubectl exec -ti volume-test -- df -hT

  • 檢視 PVC 掛載在 Node 上面的狀態
lsblk

副本檢視與拆解放置位置

  • 檢視 Longhorn 的副本在 kubernetes 資源型態為 replicas,並且名稱會與 PVC 生成的 PV 名稱類似,在後面加上 -r-<hash>,官方預設副本數量是 3,因為他是動態生成的,加上是由 longhorn 操縱,所以會在 longhorn-system Namespace 之下。
kubectl get pv,pvc
kubectl get replicas -n longhorn-system

  • Lonhorn Web UI 觀看你的 Replicas 放置的位置

設定路徑: Longhorn Web UI > Volumes > Volumm Name (點擊)

  • 檢視特定的副本狀態

這邊可以單獨觀看 replicas 狀態,需要知道它放在哪一個節點就是在這邊看。

kubectl describe <replicas-name> -n longhorn-system


  • 快速檢視你的副本再有放在哪一個節點之上
kubectl get replicas -n longhorn-system -o json | jq '[.items | .[] | {nodeName: .status.ownerID, replicaStatus: .status.currentState, instanceManager: .status.instanceManagerName, replicasPath: .spec.dataPath}]'

Longhorn 的限制

Longhorn 限制在 PVC 狀態會是 Read Write Once,所以跨節點就會爆炸,這邊就讓它炸一下,官方有提可以使用 NFS 讓 Longhorn 變成 RWX 狀態(這邊),就請有興趣的去折騰一下吧。

多 Pod 在不同 Node 會無法掛載

  • 生成一個 Longhorn PVC
apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: volume-test
    image: ubuntu
    imagePullPolicy: IfNotPresent
    command:
    - sleep
    - "6000000"
    volumeMounts:
    - name: volv
      mountPath: "/data"
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: longhorn-volv-pvc
  • 搞一個 10 Replica 的 Deploymnet 惡搞一下
deployment-use-longhorn-pvc.yaml
-----
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ubuntu-deployment
  labels:
    app: ubuntu
spec:
  replicas: 10
  selector:
    matchLabels:
      app: ubuntu
  template:
    metadata:
      labels:
        app: ubuntu
    spec:
      containers:
      - name: ubuntu-deployment
        image: ubuntu
        imagePullPolicy: Always
        command: 
        - sleep
        - "6000000"
        volumeMounts:
        - name: ubuntu-pv
          mountPath: /data
      volumes:
      - name: ubuntu-pv
        persistentVolumeClaim:
          claimName: longhorn-volv-pvc
  • 把 Deployment 部署下去
kubectl apply -f deployment-use-longhorn-pvc.yaml
  • 死掉的狀態
kubectl get pod -o wide

  • 把 Deployment 的位置全部限制到同一個 Node 之上

這邊的 node-name 自己改節點名稱一下。

deployment-use-longhorn-pvc.yaml
-----
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ubuntu-deployment
  labels:
    app: ubuntu
spec:
  replicas: 10
  selector:
    matchLabels:
      app: ubuntu
  template:
    metadata:
      labels:
        app: ubuntu
    spec:
      containers:
      - name: ubuntu-deployment
        image: ubuntu
        imagePullPolicy: Always
        command: 
        - sleep
        - "6000000"
        volumeMounts:
        - name: ubuntu-pv
          mountPath: /data
      nodeDelector:
          kubernetes.io/hostname: <node-name>
      volumes:
      - name: ubuntu-pv
        persistentVolumeClaim:
          claimName: longhorn-volv-pvc
  • 把 Deployment 部署下去
kubectl apply -f deployment-use-longhorn-pvc.yaml
  • Deployment 的 10 個 Pod 復活
kubectl get pod -o wide

限制你的 Replicas 放置與數量

非常不意外的,這邊的限縮就是老方法,用標籤搞定一切的作法,只是這邊是使用 kubernetes 的 annotation 去設定的,而並非是單純的 Node Label 機制,加上他的標籤有點其他的 bug (指令手動上非動態調整,而你用 Web UI 就可以),我們這邊就搶先試毒(採坑)一下吧,這邊會在做 Storage Class 的修改,Longhorn 會在依照 Storage Class 需求去做部署,如果不符合 Storage Class 就會導致副本數量不足。

Storage 先下手開搞

  • 限制副本數量

parameters.numberOfReplicas 改成你的副本數量

longhorn-limit-replicas-sc.yaml
-----
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: longhorn-set-replicas
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
  numberOfReplicas: "2"
  staleReplicaTimeout: "2880"
  fromBackup: ""
#  diskSelector: "ssd,fast"
#  nodeSelector: "storage,fast"
  • 限制副本擺放位置

parameters.nodeSelector 對應 Node 對於 Longhorn 的 Node Tag

longhorn-replicas-setplacement-sc.yaml
-----
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: longhorn-node-label
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
  numberOfReplicas: "3"
  staleReplicaTimeout: "2880"
  fromBackup: ""
  nodeSelector: "storage,fast"
  • Storage Class 狀態

用 Web UI 給你的節點加標籤

設定路徑: Longhorn Web UI > Nodes > Operation

用 kubectl 給你的節點加標籤

  • 這邊帶入節點名稱,後面的 "fast","storage" 拿來改,這邊就是 Longhorn 抓的節點標籤了。
kubectl annotate node <node-name> node.longhorn.io/default-node-tags='["fast","storage"]'

使用修改後的 Storage 進行 PVC 部署

基本上就是對應 storageClassName 去做設定

  • 限制副本數
longhorn-limit-replicas-pvc.yaml
-----
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-limit-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn-set-replicas
  resources:
    requests:
      storage: 10Gi
  • 限制副本擺放位置
longhorn-replicas-setplacement-pvc.yaml
-----
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-node-label-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn-label
  resources:
    requests:
      storage: 10Gi
PVC 狀態
  • 限制副本數

  • 限制副本擺放位置

Pod 使用 PVC

  • 限制副本數
apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: volume-test
    image: ubuntu
    imagePullPolicy: IfNotPresent
    command:
    - sleep
    - "6000000"
    volumeMounts:
    - name: volv
      mountPath: "/data"
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: longhorn-limit-pvc
  • 限制副本擺放位置
apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: volume-test
    image: ubuntu
    imagePullPolicy: IfNotPresent
    command:
    - sleep
    - "6000000"
    volumeMounts:
    - name: volv
      mountPath: "/data"
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: longhorn-node-label-pvc

上一篇
Day 11 Kubernetes 閃電戰-kubernetes 安裝與基礎操作篇
下一篇
Day 13 Kubernetes 戰力檢視-Rancher Dashboard 安裝基礎操作篇
系列文
基於付費公有雲與開源機房自建私有雲之雲端應用服務測試兼叢集與機房託管服務實戰之勇者崎嶇波折且劍還掉在路上的試煉之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言